/*
 * Copyright (C) 2007-2012 Geometer Plus <contact@geometerplus.com>
 *
 * This program is free software; you can redistribute it and/or modify
 * it under the terms of the GNU General Public License as published by
 * the Free Software Foundation; either version 2 of the License, or
 * (at your option) any later version.
 *
 * This program is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU General Public License for more details.
 *
 * You should have received a copy of the GNU General Public License
 * along with this program; if not, write to the Free Software
 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
 * 02110-1301, USA.
 */

package org.geometerplus.fbreader.fbreader;

import android.annotation.SuppressLint;
import android.graphics.Bitmap;
import android.graphics.drawable.Drawable;
import android.os.Handler;
import android.os.HandlerThread;
import android.os.Looper;
import android.os.Message;
import android.support.annotation.Nullable;
import android.text.TextUtils;
import android.util.Pair;
import android.view.MotionEvent;

import org.geometerplus.android.fbreader.SQLiteBooksDatabase;
import org.geometerplus.fbreader.book.Bookmark;
import org.geometerplus.fbreader.book.M17kPlainTxtBook;
import org.geometerplus.fbreader.bookmodel.BookModel;
import org.geometerplus.fbreader.bookmodel.FBHyperlinkType;
import org.geometerplus.fbreader.bookmodel.TOCTree;
import org.geometerplus.fbreader.fbreader.TapZoneMap.RectangleZone;
import org.geometerplus.fbreader.fbreader.options.MiscOptions;
import org.geometerplus.fbreader.formats.BasicChapterReader;
import org.geometerplus.fbreader.formats.IChapterReadBook;
import org.geometerplus.fbreader.formats.m17k.MTxtNovelReader;
import org.geometerplus.fbreader.formats.txt.MTxtReader;
import org.geometerplus.zlibrary.core.application.ZLApplication;
import org.geometerplus.zlibrary.core.filesystem.ZLFile;
import org.geometerplus.zlibrary.core.fonts.FontEntry;
import org.geometerplus.zlibrary.core.library.ZLibrary;
import org.geometerplus.zlibrary.core.util.ZLColor;
import org.geometerplus.zlibrary.core.view.SelectionCursor;
import org.geometerplus.zlibrary.core.view.ZLPaintContext;
import org.geometerplus.zlibrary.core.view.ZLView;
import org.geometerplus.zlibrary.core.view.ZLViewEnums;
import org.geometerplus.zlibrary.text.model.ZLTextModel;
import org.geometerplus.zlibrary.text.view.ExtensionElementManager;
import org.geometerplus.zlibrary.text.view.ModelData;
import org.geometerplus.zlibrary.text.view.NotesData;
import org.geometerplus.zlibrary.text.view.ZLTextHighlighting;
import org.geometerplus.zlibrary.text.view.ZLTextHyperlink;
import org.geometerplus.zlibrary.text.view.ZLTextHyperlinkRegionSoul;
import org.geometerplus.zlibrary.text.view.ZLTextImageRegionSoul;
import org.geometerplus.zlibrary.text.view.ZLTextPosition;
import org.geometerplus.zlibrary.text.view.ZLTextRegion;
import org.geometerplus.zlibrary.text.view.ZLTextSelection;
import org.geometerplus.zlibrary.text.view.ZLTextVideoRegionSoul;
import org.geometerplus.zlibrary.text.view.ZLTextView;
import org.geometerplus.zlibrary.text.view.ZLTextWordRegionSoul;
import org.geometerplus.zlibrary.text.view.style.ZLTextStyleCollection;
import org.geometerplus.zlibrary.ui.android.view.ZLAndroidPaintContext;
import org.geometerplus.zlibrary.ui.android.view.animation.AnimationManager;
import org.geometerplus.zlibrary.ui.android.view.animation.BaseAnimationProvider;

import java.util.ArrayList;
import java.util.Collections;
import java.util.HashMap;
import java.util.List;
import java.util.Locale;

public class FBView extends ZLTextView {
    private FBReaderApp myReader;
    //    private Header mHeader;
//    private Footer mFooter;

    private Handler mMainHandler;
    private Bitmap batteryBitmap = null;
    private String batteryIcoPath = "";
//    private OnPageChangedListener mListener;


    FBView(FBReaderApp reader) {
        super(reader);
        myReader = reader;
//        mMainHandler = new Handler(Looper.getMainLooper());
//        startChapterThread();
    }

    //两列视图
    @Override
    public boolean twoColumnView() {
        return false;
    }

    @Override
    public ZLTextStyleCollection getTextStyleCollection() {
        return null;
    }

    @Override
    public ImageFitting getImageFitting() {
        return null;
    }

    @Override
    public int getLeftMargin() {
        return 0;
    }

    @Override
    public int getRightMargin() {
        return 0;
    }

    @Override
    public int getTopMargin() {
        return 0;
    }

    @Override
    public int getBottomMargin() {
        return 0;
    }

    @Override
    public int getSpaceBetweenColumns() {
        return 0;
    }


    @Override
    public ZLFile getWallpaperFile() {
        return null;
    }

    @Override
    public ZLPaintContext.FillMode getFillMode() {
        return null;
    }

    @Override
    public ZLColor getBackgroundColor() {
        return null;
    }

    @Override
    public ZLColor getSelectionBackgroundColor() {
        return null;
    }

    @Override
    public ZLColor getSelectionForegroundColor() {
        return null;
    }

    @Override
    public ZLColor getHighlightingBackgroundColor() {
        return null;
    }

    @Override
    public ZLColor getHighlightingForegroundColor() {
        return null;
    }

    @Override
    public ZLColor getTextColor(ZLTextHyperlink hyperlink) {
        return null;
    }

    @Override
    public FooterArea getFooterArea() {
        return null;
    }

    @Override
    public FooterArea getHeaderArea() {
        return null;
    }

    @Override
    public Animation getAnimationType() {
        return null;
    }

    @Override
    protected void paintModel(ModelData modelData, ZLPaintContext context, PageIndex pageIndex, boolean drawHeaderOnly) {

    }

    @Override
    public void doShiftPage(PageIndex pageIndex) {

    }

    @Override
    public boolean isScrollbarShown() {
        return false;
    }

    @Override
    public int getScrollbarFullSize() {
        return 0;
    }

    @Override
    public int getScrollbarThumbPosition(PageIndex pageIndex) {
        return 0;
    }

    @Override
    public int getScrollbarThumbLength(PageIndex pageIndex) {
        return 0;
    }

    @Override
    public List<Bookmark> getBookmarksInPage(PageIndex index) {
        return null;
    }

    @Override
    public List<Bookmark> getBookmarksInPage(ModelData modelData, PageIndex index) {
        return null;
    }

    @Override
    public boolean canScroll(PageIndex index) {
        return false;
    }

    @Override
    public boolean doProcessNoPageData(ZLPaintContext context, PageIndex index) {
        return false;
    }

    //    public void setOnPageChangedListener(OnPageChangedListener mListener) {
    //        this.mListener = mListener;
    //    }
    //
    //
    //    private String myZoneMapId;
    //    private TapZoneMap myZoneMap;
    //
    //    private TapZoneMap getZoneMap() {
    //        // final String id =
    //        // ScrollingPreferences.Instance().TapZonesSchemeOption.getValue().toString();
    //        final String id = ScrollingPreferences.Instance().HorizontalOption
    //                .getValue() ? "right_to_left" : "up";
    //        if (!id.equals(myZoneMapId)) {
    //            myZoneMap = new TapZoneMap(id);
    //            myZoneMapId = id;
    //        }
    //        return myZoneMap;
    //    }
    //
    //
    //    public boolean preDoTouchEvent(MotionEvent event) {
    //
    //        //LogUtil.d("FBView", "moveSelectionCursorTo:" + (myEditSelection != null ? "moveSelectionCursorTo != null" : "moveSelectionCursorTo==null" + " mInSelectingState=" + mInSelectingState));
    //
    //        if (mInSelectingState == SelectStateEnum.SelectState_Selecting) {
    //            int x = (int) event.getX();
    //            int y = (int) event.getY();
    //            switch (event.getAction()) {
    //                case MotionEvent.ACTION_DOWN: {
    //
    //                    myReader.hideActivePopup();
    //                    if (isSelectStartPoint(x, y)) {
    //
    //                        final SelectionCursor.Which cursor = SelectionCursor.Which.Left;
    //                        moveSelectionCursorTo(cursor, x, y);
    ////					 Toast.makeText(FBReaderApp.Instance().getAppContext(),
    ////                             "选择了起始点", Toast.LENGTH_SHORT).show();
    //
    //                    } else if (isSelectEndPoint(x, y)) {
    //
    //                        final SelectionCursor.Which cursor = SelectionCursor.Which.Right;
    //                        moveSelectionCursorTo(cursor, x, y);
    //
    ////					 Toast.makeText(FBReaderApp.Instance().getAppContext(),
    ////					 "选择了终止点", Toast.LENGTH_SHORT).show();
    //                    } else {
    //                        clearSelection();
    //                    }
    //
    //                }
    //                break;
    //                case MotionEvent.ACTION_UP: {
    //                    if (getEditSelection() == null) {
    //                        mInSelectingState = SelectStateEnum.SelectState_Idle;
    //                    } else {
    //                        getEditSelection().stop();
    //                        Application.getViewWidget().repaintForcely();
    //
    //                        myReader.doAction(ActionCode.SELECTION_SHOW_PANEL);
    //                    }
    //                }
    //                break;
    //                case MotionEvent.ACTION_MOVE: {
    //                    LogUtil.d("FBView", "onTouchEvent(ACTION_MOVE)");
    //                    if (getEditSelection() != null) {
    //
    //                        final SelectionCursor.Which cursor = getSelectionCursorInMovement();
    //                        if (cursor != null) {
    //                            moveSelectionCursorTo(cursor, x, y);
    //                        }
    //                    }
    //
    //                }
    //                break;
    //                case MotionEvent.ACTION_CANCEL: {
    //                    clearSelection();
    //                    mInSelectingState = SelectStateEnum.SelectState_Idle;
    //                }
    //                break;
    //                default:
    //                    break;
    //            }
    //
    //            return true;
    //        }
    //        return false;
    //    }
    //
    //    @Override
    //    public List<Bookmark> getBookmarksInPage(PageIndex index) {
    //        return getBookmarksInPage(null, index);
    //    }
    //
    //    @Override
    //    public List<Bookmark> getBookmarksInPage(ModelData modelData, PageIndex index) {
    //        List<Bookmark> bookmarks = new ArrayList<Bookmark>();
    //        if (FBReaderApp.Instance() == null
    //                || ((FBReaderApp) FBReaderApp.Instance()).Model == null) {
    //            return bookmarks;
    //        }
    //        List<Bookmark> allmarks = ((FBReaderApp) FBReaderApp.Instance()).Model
    //                .getAllBookmarks();
    //        if (allmarks == null || allmarks.isEmpty()) {
    //            return bookmarks;
    //        }
    //        if (modelData == null) {
    //            modelData = myCurrModelData;
    //        }
    //        ZLTextPosition startCursor = modelData.getStartCursor(index);
    //        ZLTextPosition endCursor = modelData.getEndCursor(index);
    //
    //
    //        int compare1 = 0, compare2 = 0;
    //
    //        String tag = null;
    //
    //        /*final FBReaderApp reader = myReader;
    //
    //        final BookModel model = reader.Model;
    //        if (model != null && model.Book != null
    //                && model.Book instanceof IChapterReadBook) {
    //            final BasicChapterReader txtReader = ((IChapterReadBook) (model.Book))
    //                    .getReader();
    //            if (txtReader != null) {
    //                tag = txtReader.getReadingChapter() != null ? txtReader
    //                        .getReadingChapter().getId() : null;
    //            }
    //
    //        }*/
//        if (modelData.getReadingChapter() != null && modelData.getReadingChapter() instanceof Chapter) {
//            tag = ((Chapter) modelData.getReadingChapter()).getId();
//        }
//        // fixed:4.3.0崩溃日志收集-数组遍历时有可能发生java.util.ConcurrentModificationException
//        try {
//            List<Bookmark> tmpMarks = new ArrayList<Bookmark>();
//            tmpMarks.addAll(allmarks);
//            if (TextUtils.isEmpty(tag)) {
//                for (Bookmark mark : tmpMarks) {
//                    compare1 = mark.compareTo(startCursor);
//                    compare2 = mark.compareTo(endCursor);
//                    if (compare1 >= 0 && compare2 < 0) {
//                        bookmarks.add(mark);
//                    }
//                }
//            } else {
//
//                for (Bookmark mark : tmpMarks) {
//                    if (!tag.equalsIgnoreCase(mark.getTag())) {
//                        continue;
//                    }
//                    // Log.d("Draw", "mark:" + mark.toString());
//                    compare1 = mark.compareTo(startCursor);
//                    compare2 = mark.compareTo(endCursor);
//                    if (compare1 >= 0 && compare2 < 0) {
//                        bookmarks.add(mark);
//                    }
//                }
//            }
//            tmpMarks.clear();
//            tmpMarks = null;
//        } catch (Exception e) {
//            e.printStackTrace();
//        }
//        return bookmarks;
//    }
//
//    protected ZLTextRegion findRegion(int x, int y, ZLTextRegion.Filter filter) {
//        synchronized (AnimationManager.mLockObj) {
//            return findRegion(x, y, Integer.MAX_VALUE - 1, filter);
//        }
//    }
//
//    protected ZLTextRegion findRegion(int x, int y, int maxDistance, ZLTextRegion.Filter filter) {
//        synchronized (AnimationManager.mLockObj) {
//            try {
//                return getCurrentTextPage().TextElementMap.findRegion(x, y, maxDistance, filter);
//            } catch (NullPointerException e) {
//                return null;
//            }
//        }
//    }
//
//    @Override
//    public boolean onFingerSingleTap(int x, int y) {
//
//
//        //vip购买点击事件
//
//        synchronized (AnimationManager.mLockObj) {
//            final ZLTextRegion hyperlinkRegion = findRegion(x, y, maxSelectionDistance(), ZLTextRegion.HyperlinkFilter);
//            if (hyperlinkRegion != null) {
//                outlineRegion(hyperlinkRegion);
//                myReader.getViewWidget().repaintForcely();
//                myReader.doAction(ActionCode.PROCESS_HYPERLINK);
//                return true;
//            }
//            final ZLTextRegion videoRegion = findRegion(x, y, 0, ZLTextRegion.VideoFilter);
//            if (videoRegion != null) {//预计是tts播放时候使用
//                outlineRegion(videoRegion);
//                myReader.getViewWidget().repaintForcely();
//                myReader.doAction(ActionCode.OPEN_VIDEO, (ZLTextVideoRegionSoul) videoRegion.getSoul());
//                return true;
//            }
//
//            final ZLTextHighlighting highlighting = findHighlighting(x, y, maxSelectionDistance());
//            if (highlighting != null && highlighting instanceof BookmarkHighlighting) {//预计点击书签
//                myReader.doAction(
//                        ActionCode.SELECTION_BOOKMARK,
//                        ((BookmarkHighlighting) highlighting).Bookmark
//                );
//                return true;
//            }
//        }
//
//
//        if (myReader != null && myReader.Model != null
//                && myReader.Model.Book != null
//                && myReader.Model.Book instanceof M17kPlainTxtBook) {
//            M17kPlainTxtBook book = (M17kPlainTxtBook) myReader.Model.Book;
//            Chapter readingChapter =
//                    book.getReader().getReadingChapter();
//            if (readingChapter != null && readingChapter.getId() != null) {
//                if (!needPainTips(readingChapter) && NotesData.instance().gotoNoteInRead(this, x, y)) {
//                    return true;
//                }
//            }
//
//        }
//        int tempY = y;
////        //坐标计算 暂时只能计算出来当前正在刷新的，已经刷新过的无法进行计算
//        if (myReader != null && (myReader.getBookReader().getAnimationManager().getAnimationProvider(ReadSettingUtil.getFlipAnimation()) instanceof VerticalShiftAnimationProvider)) {
//            VerticalShiftAnimationProvider mVerticalShiftAnimationProvider = (VerticalShiftAnimationProvider) myReader.getBookReader().getAnimationManager().getAnimationProvider(ReadSettingUtil.getFlipAnimation());
//            tempY -= mVerticalShiftAnimationProvider.getmOffsetY();
//
//            tempY += getTopMargin();
//
//        }
//
//        //弹出菜单
//        if ((TTSManager.getInstance().isWorking() && TTSManager.getInstance().getStatus() != TTSManager.STATUS_STOP) || ReadSettingUtil.isAutoFlip()) {
//            if (mListener != null) {
//                switch (getZoneMap()
//                        .getActionByCoordinates(
//                                x,
//                                y,
//                                getContextWidth(),
//                                getContextHeight(),
//                                isDoubleTapSupported() ? TapZoneMap.Tap.singleNotDoubleTap
//                                        : TapZoneMap.Tap.singleTap, tempY)) {
//                    case ActionCode.TURN_PAGE_FORWARD:
//                    case ActionCode.TURN_PAGE_BACK:
//                        mListener.onPageChange();
//                        break;
//                }
//            }
//        }
//
//
//        if (myReader != null) {
//            return myReader
//                    .doAction(
//                            getZoneMap()
//                                    .getActionByCoordinates(
//                                            x,
//                                            y,
//                                            getContextWidth(),
//                                            getContextHeight(),
//                                            isDoubleTapSupported() ? TapZoneMap.Tap.singleNotDoubleTap
//                                                    : TapZoneMap.Tap.singleTap, tempY),
//                            x,
//                            y,
//                            getZoneMap()
//                                    .getActionExtralDataByCoordinates(x,
//                                            tempY, getContextWidth(),
//                                            getContextHeight(),
//                                            TapZoneMap.Tap.doubleTap));
//        } else {
//            return false;
//        }
//
//    }
//
//    @Override
//    public boolean isDoubleTapSupported() {
//        return myReader.EnableDoubleTapOption.getValue();
//    }
//
//    @Override
//    public boolean onFingerDoubleTap(int x, int y) {
//
//        //myReader.doAction(ActionCode.HIDE_TOAST);
//
//
//        if (super.onFingerDoubleTap(x, y)) {
//            return true;
//        }
//        myReader.doAction(
//                getZoneMap().getActionByCoordinates(x, y,
//                        getContextWidth(),
//                        getContextHeight(),
//                        TapZoneMap.Tap.doubleTap),
//                x,
//                y,
//                getZoneMap().getActionExtralDataByCoordinates(x, y,
//                        getContextWidth(),
//                        getContextHeight(),
//                        TapZoneMap.Tap.doubleTap));
//        return false;
//    }
//
//    @Override
//    public boolean onFingerPress(int x, int y) {
//        try {
//            myReader.doAction(ActionCode.HIDE_TOAST);
//        } catch (NullPointerException e) {
//            e.printStackTrace();
//            return false;
//        }
//
//        if (TTSManager.getInstance().isWorking() && TTSManager.getInstance().getStatus() != TTSManager.STATUS_STOP) {
//            return true;
//        }
//
//
//        if (super.onFingerPress(x, y)) {
//            return true;
//        }
//        synchronized (AnimationManager.mLockObj) {
//
//            final float maxDist = ZLibrary.Instance().getDisplayDPI() / 3f;
//            ZLTextSelection.Point startPoint = getLeftSelectionPoint();
//            ZLTextSelection.Point endPoint = getRightSelectionPoint();
//            SelectionCursor.Which cursor = null;
//            final int dpi = ZLibrary.Instance().getDisplayDPI();
//            final int unit = dpi / 120;
//            final int cursorHeight = unit * 9;
//            if (startPoint != null) {
//                int topY = startPoint.Y - dpi / 10 - unit * 7 - unit / 2;
//                int bottomY = topY + cursorHeight;
//                if (Math.abs(x - (startPoint.X - unit)) <= (1.5f * unit) && x >= topY && x <= bottomY) {
//                    cursor = SelectionCursor.Which.Left;
//                }
//
//
//            } else if (endPoint != null) {
//                int bottomY = endPoint.Y + dpi / 10 + unit * 7 + unit / 2;
//                int topY = bottomY - cursorHeight;
//
//                if (Math.abs(x - (endPoint.X + unit)) <= (1.5f * unit) && x >= topY && x <= bottomY) {
//                    cursor = SelectionCursor.Which.Right;
//                }
//
//            }
//            if (cursor != null) {
//                myReader.doAction(ActionCode.SELECTION_HIDE_PANEL);
//                moveSelectionCursorTo(cursor, x, y);
//                return true;
//            }
//        }
//        startManualScrolling(x, y);
//        return true;
//    }
//
//    private boolean isFlickScrollingEnabled() {
//        final ScrollingPreferences.FingerScrolling fingerScrolling = ScrollingPreferences
//                .Instance().FingerScrollingOption.getValue();
//        return fingerScrolling == ScrollingPreferences.FingerScrolling.byFlick
//                || fingerScrolling == ScrollingPreferences.FingerScrolling.byTapAndFlick;
//    }
//
//    /* 手动拖动时动画 */
//    private void startManualScrolling(int x, int y) {
//        if (!isFlickScrollingEnabled()) {
//            return;
//        }
//        myReader.getViewWidget().startManualScrolling(x, y);
//    }
//
//    @Override
//    public boolean onFingerMove(int x, int y) {
//        if (TTSManager.getInstance().isWorking() && TTSManager.getInstance().getStatus() != TTSManager.STATUS_STOP) {
//            return true;
//        }
////        if(ReadSettingUtil.isAutoFlip())
////        {
////            BaseAnimationProvider autoReadAnimationProvider = ((ZLAndroidWidget)myReader.getViewWidget()).getAutoReadAnimationProvider();
////            autoReadAnimationProvider.onMove(x, y);
////            return true;
////        }
//        synchronized (AnimationManager.mLockObj) {
//            final SelectionCursor.Which cursor = getSelectionCursorInMovement();
//            if (cursor != null) {
//                moveSelectionCursorTo(cursor, x, y);
//                return true;
//            }
//
//        }
//
//        synchronized (this) {
//            if (isFlickScrollingEnabled()) {
//                myReader.getViewWidget().scrollManuallyTo(x, y);
//            }
//        }
//        return false;
//    }
//
//    @Override
//    public boolean onFingerRelease(BaseAnimationProvider.AnimationFling fling, int x, int y) {
//
//
////        if(ReadSettingUtil.isAutoFlip())
////        {
////            BaseAnimationProvider autoReadAnimationProvider = ((ZLAndroidWidget)myReader.getViewWidget()).getAutoReadAnimationProvider();
////            autoReadAnimationProvider.onRelease(x, y);
////            return true;
////        }
//
//        final SelectionCursor.Which cursor = getSelectionCursorInMovement();
//        if (cursor != null) {
//            releaseSelectionCursor();
//            return true;
//        }
//
//        if (isFlickScrollingEnabled() && myReader.getViewWidget() != null) {
//
//            myReader.getViewWidget().startAnimatedScrolling(fling,
//                    x,
//                    y);
//            return true;
//        }
//
//        return false;
//    }
//
//
//    public enum SelectStateEnum {
//        SelectState_Idle, SelectState_BeginSelect, SelectState_Selecting, SelectState_Moving
//    }
//
//    private volatile SelectStateEnum mInSelectingState = SelectStateEnum.SelectState_Idle;
//
//    protected ZLTextRegion[] findRegionWithFullyParagh(ZLTextRegion region,
//                                                       ZLTextRegion.Filter filter) {
//        synchronized (AnimationManager.mLockObj) {
//            return getCurrentTextPage().TextElementMap.findRegionInSamePragraph(region,
//                    filter);
//        }
//
//    }
//
//    public boolean initSelection(ZLTextRegion startSelection,
//                                 ZLTextRegion endSelection) {
//
//
//        if (myCurrModelData.initSelection(startSelection, endSelection)) {
//            Application.getViewWidget().repaintForcely();
//            return true;
//        }
//        return false;
//    }
//
//    public boolean onFingerLongPress(int x, int y) {
//        // fixed:4.3.0崩溃日志收集，可能出现空指针异常
//        try {
//            myReader.doAction(ActionCode.HIDE_TOAST);
//        } catch (Exception e) {
//            e.printStackTrace();
//            return false;
//        }
//        if ((TTSManager.getInstance().isWorking() && TTSManager.getInstance().getStatus() != TTSManager.STATUS_STOP) || ReadSettingUtil.isAutoFlip()) {
//            return true;
//        }
//        if (super.onFingerLongPress(x, y)) {
//            return true;
//        }
//
//        FBReaderApp fbReader = (FBReaderApp) FBReaderApp.Instance();
//        if (fbReader.Model == null || fbReader.Model.Book == null) {
//            return true;
//        }
//        mInSelectingState = SelectStateEnum.SelectState_Idle;
//        clearSelection();
//        synchronized (AnimationManager.mLockObj) {
//            ZLTextRegion region = null;
//            try {
//                // fixed:4.4.1, getCurrentTextPage方法有出现空指针异常的可能
//                region = findRegion(x, y, maxSelectionDistance(), ZLTextRegion.AnyRegionFilter);
//            } catch (Exception e) {
//                e.printStackTrace();
//            }
//            if (region != null) {
//                final ZLTextRegion.Soul soul = region.getSoul();
//                boolean doSelectRegion = false;
//                if (soul instanceof ZLTextWordRegionSoul) {
//                    ZLTextRegion[] rs = findRegionWithFullyParagh(region,
//                            ZLTextRegion.AnyRegionFilter);
//                    if (rs != null) {
//                        switch (myReader.MiscOptions.WordTappingAction.getValue()) {
//                            case startSelecting: {
//                                myReader.doAction(ActionCode.SELECTION_HIDE_PANEL);
//                                if (fbReader.Model != null
//                                        && fbReader.Model.Book != null
//                                        && fbReader.Model.Book instanceof M17kPlainTxtBook) {
//                                    if (initSelection(rs[0], rs[1])) {
//                                        mInSelectingState = SelectStateEnum.SelectState_BeginSelect;
//
//                                        myReader.getViewWidget().getParentContainer()
//                                                .setPullScrollingState(false);
//                                        return true;
//                                    }
////
//                                }
//
//                                return true;
//                            }
//                            case selectSingleWord:
//                            case openDictionary:
//                                doSelectRegion = true;
//                                break;
//                        }
//                    }
//
//                } else if (soul instanceof ZLTextImageRegionSoul) {
//                    doSelectRegion = true;
//                } else if (soul instanceof ZLTextHyperlinkRegionSoul) {
//                    doSelectRegion = true;
//                }
//
//                if (doSelectRegion) {
//                    outlineRegion(region);
//                    myReader.getViewWidget().repaintForcely();
//                    return true;
//                }
//            }
//        }
//
//
//        return false;
//    }
//
//    public boolean onFingerMoveAfterLongPress(int x, int y) {
//
//        if ((TTSManager.getInstance().isWorking() && TTSManager.getInstance().getStatus() != TTSManager.STATUS_STOP) || ReadSettingUtil.isAutoFlip()) {
//            return true;
//        }
//        if (super.onFingerMoveAfterLongPress(x, y)) {
//            return true;
//        }
//
//        if (true) {
//            return true;
//        }
//
//
//        synchronized (AnimationManager.mLockObj) {
//            final SelectionCursor.Which cursor = getSelectionCursorInMovement();
//            if (cursor != null) {
//                moveSelectionCursorTo(cursor, x, y);
//                return true;
//            }
//
//            ZLTextRegion region = getOutlinedRegion();
//            if (region != null) {
//                ZLTextRegion.Soul soul = region.getSoul();
//                if (soul instanceof ZLTextHyperlinkRegionSoul ||
//                        soul instanceof ZLTextWordRegionSoul) {
//                    if (myReader.MiscOptions.WordTappingAction.getValue() !=
//                            MiscOptions.WordTappingActionEnum.doNothing) {
//                        region = findRegion(x, y, maxSelectionDistance(), ZLTextRegion.AnyRegionFilter);
//                        if (region != null) {
//                            soul = region.getSoul();
//                            if (soul instanceof ZLTextHyperlinkRegionSoul
//                                    || soul instanceof ZLTextWordRegionSoul) {
//                                outlineRegion(region);
//                                myReader.getViewWidget().repaintForcely();
//                            }
//                        }
//                    }
//                }
//            }
//        }
//
//        return true;
//    }
//
//
//    public void resetRegionPointer() {
//
//    }
//
//    @Override
//    public boolean onFingerReleaseAfterLongPress(int x, int y) {
//
//        if ((TTSManager.getInstance().isWorking() && TTSManager.getInstance().getStatus() != TTSManager.STATUS_STOP) || ReadSettingUtil.isAutoFlip()) {
//            return true;
//        }
//        if (super.onFingerReleaseAfterLongPress(x, y)) {
//            return true;
//        }
//
//        if (mInSelectingState == SelectStateEnum.SelectState_BeginSelect) {
//            mInSelectingState = SelectStateEnum.SelectState_Selecting;
//            showSelectionPanel();
//            return true;
//        }
//        // final ZLTextSelectionCursor cursor = getSelectionCursorInMovement();
//        // // Log.d("NOTE", "cursor: cursor != null" + cursor != null &&
//        // // cursor.name());
//        // if (cursor != null && cursor != ZLTextSelectionCursor.None) {
//        // releaseSelectionCursor();
//        // return true;
//        // }
//
//        synchronized (AnimationManager.mLockObj) {
//            final ZLTextRegion region = getOutlinedRegion();
//            if (region != null) {
//                final ZLTextRegion.Soul soul = region.getSoul();
//
//                boolean doRunAction = false;
//                if (soul instanceof ZLTextWordRegionSoul) {
//                    doRunAction = myReader.WordTappingActionOption.getValue() == FBReaderApp.WordTappingAction.openDictionary;
//                } else if (soul instanceof ZLTextImageRegionSoul) {
//                    doRunAction = myReader.ImageTappingActionOption.getValue() == FBReaderApp.ImageTappingAction.openImageView;
//                }
//
//                if (doRunAction) {
//                    myReader.doAction(ActionCode.PROCESS_HYPERLINK);
//                    return true;
//                }
//            }
//        }
//
//
//        return false;
//    }
//
//    @SuppressWarnings("unused")
//    public boolean onTrackballRotated(int diffX, int diffY) {
//        if (diffX == 0 && diffY == 0) {
//            return true;
//        }
//
//        final Direction direction = (diffY != 0) ? (diffY > 0 ? Direction.down
//                : Direction.up) : (diffX > 0 ? Direction.leftToRight
//                : Direction.rightToLeft);
//
//        new MoveCursorAction(myReader, direction).run();
//        return true;
//    }
//
//    ZLTextStyleCollection myTextStyleCollection = null;
//
//    @Override
//    public ZLTextStyleCollection getTextStyleCollection() {
//        if (myTextStyleCollection == null) {
//            myTextStyleCollection = ZLTextStyleCollection.Instance();
//        }
//        return myTextStyleCollection;
//
//
//    }
//
//    @Override
//    public ImageFitting getImageFitting() {
//        return ImageFitting.none;
//    }
//
//    @Override
//    public int getLeftMargin() {
//        return myReader.LeftMarginOption.getValue();
//    }
//
//    @Override
//    public int getRightMargin() {
//        return myReader.RightMarginOption.getValue();
//    }
//
//    @Override
//    public int getTopMargin() {
//        return (myReader == null ? 0 : myReader.TopMarginOption.getValue())
//                + (getHeaderArea() != null ? getHeaderArea().getHeight() : 0);
//    }
//
//    @Override
//    public int getBottomMargin() {
//        return (myReader == null ? 0 : myReader.BottomMarginOption.getValue())
//                + (getFooterArea() != null ? getFooterArea().getHeight() : 0);
//    }
//
//    @Override
//    public int getSpaceBetweenColumns() {
//        return 0;
//    }
//
//    @Override
//    public boolean twoColumnView() {
//        return false;
//    }
//
//    @Override
//    public ZLFile getWallpaperFile() {
//        final String filePath = myReader.getColorProfile().WallpaperOption
//                .getValue();
//        if ("".equals(filePath)) {
//            return null;
//        }
//
//        final ZLFile file = ZLFile.createFileByPath(filePath);
//        if (file == null || !file.exists()) {
//            return null;
//        }
//        return file;
//    }
//
//    @Override
//    public ZLPaintContext.FillMode getFillMode() {
//        return ReadSettingUtil.getWallPaperFillMode();
//    }
//
//
//    @Override
//    public ZLColor getBackgroundColor() {
//        return myReader.getColorProfile().BackgroundOption.getValue();
//    }
//
//    @Override
//    public ZLColor getSelectionBackgroundColor() {
//        return new ZLColor(0x26, 0x8a, 0xb9,
//                0x59);
//    }
//
//    @Override
//    public ZLColor getSelectionForegroundColor() {
//        return null;
//    }
//
//    @Override
//    public ZLColor getHighlightingBackgroundColor() {
//        return null;//myReader.getColorProfile().HighlightingBackgroundOption.getValue();
//    }
//
//    @Override
//    public ZLColor getHighlightingForegroundColor() {
//        return myReader.getColorProfile().SelectionForegroundOption.getValue();//myReader.getColorProfile().HighlightingForegroundOption.getValue();
//    }
//
//    private ZLColor mSelectedBackgroundColor = new ZLColor(0x26, 0x8a, 0xb9,
//            0x59);
//
//
//    public ZLColor getSelectedBackgroundColor() {
//        return mSelectedBackgroundColor;
//    }
//
//
//    public ZLColor getSelectedForegroundColor() {
//        return myReader.getColorProfile().RegularTextOption.getValue();
//    }
//
//    @Override
//    public ZLColor getTextColor(ZLTextHyperlink hyperlink) {
//        final ColorProfile profile = myReader.getColorProfile();
//        switch (hyperlink.Type) {
//            default:
//            case FBHyperlinkType.NONE:
//                return profile.RegularTextOption.getValue();
//            case FBHyperlinkType.INTERNAL:
//                return myReader.Model.Book.isHyperlinkVisited(SQLiteBooksDatabase.Instance(), hyperlink.Id) ? profile.VisitedHyperlinkTextOption
//                        .getValue() : profile.HyperlinkTextOption.getValue();
//            case FBHyperlinkType.EXTERNAL:
//                return profile.HyperlinkTextOption.getValue();
//        }
//    }
//
//
//    @Override
//    protected void releaseSelectionCursor() {
//        super.releaseSelectionCursor();
//        if (getCountOfSelectedWords() > 0) {
//            myReader.doAction(ActionCode.SELECTION_SHOW_PANEL);
//        }
//    }
//
//    private void showSelectionPanel() {
//
//        if (getCountOfSelectedWords() > 0) {
//            myReader.doAction(ActionCode.SELECTION_SHOW_PANEL);
//        }
//    }
//
//    public String getSelectedText() {
//        final TextBuildTraverser traverser = new TextBuildTraverser(this);
//        if (!isSelectionEmpty()) {
//            traverser.traverse(getSelectionStartPosition(),
//                    getSelectionEndPosition());
//        }
//        return traverser.getText();
//    }
//
//    public int getCountOfSelectedWords() {
//        final WordCountTraverser traverser = new WordCountTraverser(this);
//        if (!isSelectionEmpty() && traverser != null) {
//            traverser.traverse(getSelectionStartPosition(),
//                    getSelectionEndPosition());
//        }
//        return traverser != null && traverser.getCount() > 0 ? traverser.getCount() : 0;
//    }
//
//    public static final int SCROLLBAR_SHOW_AS_FOOTER = 3;
//
//    @Override
//    public int scrollbarType() {
//        return myReader == null ? 0 : myReader.ScrollbarTypeOption.getValue();
//    }
//
//    @Override
//    protected ZLPaintContext.ColorAdjustingMode getAdjustingModeForImages() {
//        return ZLPaintContext.ColorAdjustingMode.NONE;
//    }
//
//
//    @Override
//    public Animation getAnimationType() {
//        return ScrollingPreferences.Instance().AnimationOption.getValue();
//    }
//
//    private boolean mForceHideBookMark;
//
//
//    private class Header implements HeaderArea {
//        private int titleHeight = -1;
//        private List<FontEntry> myFontEntry;
//        //        private Runnable UpdateTask = new Runnable() {
////            public void run() {
////                if (myReader != null && myReader.getViewWidget() != null) {
////                    LogUtil.i(GlobalConstants.READER_LOG, "FBView Header UpdateTask");
////                    LogUtil.e("阅读器时间","----15秒时间到");
////                    myReader.getViewWidget().repaint();
////                }
////            }
////        };
//        ZLAndroidPaintContext context;
//
//        Header() {
////            context = new ZLAndroidPaintContext(null, null, new ZLAndroidPaintContext.Geometry(0, 0, 0, 0, 0, 0), 0);
//            context = ZLAndroidPaintContext.getInstence("header", null, null, new ZLAndroidPaintContext.Geometry(0, 0, 0, 0, 0, 0), 0);
//
//        }
//
//        private int getBookMarkWidth() {
//            return getRightMargin() + 20;
//        }
//
//        public int getHeight() {
//
//            if (titleHeight <= 0) {
//
//                ReadRenderSetting renderSetting = ReadRenderSetting
//                        .getInstance();
//                ReadActivity readActivity = (ReadActivity) FBReaderApp
//                        .Instance().getAppContext();
//                Bitmap batteryBitmap = renderSetting
//                        .getBatteryBgBmp(ReadSettingUtil.getBatteryFramePath());
//
//                FBReaderApp reader = myReader;
//                if (reader == null || null == batteryBitmap) {
//                    return 0;
//                }
//                final String family = reader.FooterFontOption.getValue();
//                if (myFontEntry == null || !family.equals(myFontEntry.get(0).Family)) {
//                    myFontEntry = Collections.singletonList(FontEntry.systemEntry(family));
//                }
//                context.setFont(myFontEntry,
//                        renderSetting.getTitleFontSize(), false, false, false,
//                        false);
//                titleHeight = (batteryBitmap.getHeight() > context
//                        .getFontHeight() ? batteryBitmap.getHeight() : context
//                        .getFontHeight())
//                        + renderSetting.getHeaderAndFooterVerticalPadding() * 2;
//                Drawable d = renderSetting.getBookmarkDrawable();
//                titleHeight = titleHeight > (d.getIntrinsicHeight() + 2) ? titleHeight
//                        : (d.getIntrinsicHeight() + 2);
//                if (batteryBitmap != null && !batteryBitmap.isRecycled()) {
//                    batteryBitmap.recycle();
//                }
//                batteryBitmap = null;
//            }
//            return titleHeight;
//        }
//
//        public void paint(ZLPaintContext context, PageIndex index) {
//            paint(myCurrModelData, context, index);
//        }
//
//        /**
//         * 绘制电量书签等信息
//         *
//         * @param modelData
//         * @param context
//         * @param index
//         */
//        public void paint(ModelData modelData, ZLPaintContext context, PageIndex index) {
//
//            FBReaderApp reader = myReader;
//            if (reader == null) {
//                return;
//            }
//            mChapterHandler.sendEmptyMessage(0);
//
//
//            ReadRenderSetting renderSetting = ReadRenderSetting.getInstance();
//            ZLAndroidPaintContext paintContext = (ZLAndroidPaintContext) context;
//
//            String curTimeString = ZLibrary.Instance().getCurrentTimeString();
//
//            //getBookmarskInPage因为可能要进行分布操作，所以可能会修改Paint属性
//            /*List<Bookmark> bookmarks = getBookmarksInPage(modelData, index);
//            boolean drawMarkFlag = bookmarks != null && !bookmarks.isEmpty();
//            //绘制书签
//            if (drawMarkFlag && !mForceHideBookMark && !(ReadSettingUtil.isAutoFlip() && ReadSettingUtil.getAutoFlipType() == ReadSettingUtil.AUTO_FLIP_TYPE_SCROLL)) {
//
//                Drawable d = renderSetting.getBookmarkDrawable();
//                d.setBounds(
//                        paintContext.getWidth() - 5 - d.getIntrinsicWidth(), 0,
//                        paintContext.getWidth() - 5, d.getIntrinsicHeight());
//                paintContext.drawDrawable(d);
//            }*/
//            setFont(paintContext);
//
//            setTextColor(paintContext, ReadSettingUtil.getCurHeaderFooterColor());
//            //绘制电量图标
//            if ((batteryIcoPath.isEmpty()) || (!batteryIcoPath.equals(ReadSettingUtil.getBatteryFramePath()))) {
//                batteryBitmap = ReadRenderSetting.getInstance().getBatteryBgBmp(ReadSettingUtil.getBatteryFramePath());
//            }
//            if ((null == batteryBitmap) || (batteryBitmap.isRecycled())) {
//                batteryBitmap = ReadRenderSetting.getInstance().getBatteryBgBmp(ReadSettingUtil.getBatteryFramePath());
//            }
//            int x = paintContext.getWidth() - getRightMargin() - batteryBitmap.getWidth();
//            int y = (getHeight() - batteryBitmap.getHeight()) / 2;
//            drawBattery(batteryBitmap, paintContext, ReadSettingUtil.getBatteryFillColor(), x, y);
//
//            x = x - paintContext.getStringWidth(curTimeString);
//            y = (getHeight() - paintContext.getFontHeight()) / 2 + paintContext.getAscent();
//            LogUtil.e("阅读器时间", "----" + curTimeString);
//            drawCurrentTime(curTimeString, paintContext, x, y);
//
//            //绘制章节名称
//            int titleWidth = y - getLeftMargin() - 10;
//            String strBookTitle = modelData.getChapterTitle(index);
//            int charCount = paintContext.measureText(strBookTitle, titleWidth);
//            if (charCount > 0 && strBookTitle != null && charCount < strBookTitle.length()) {
//                strBookTitle = strBookTitle.substring(0, charCount - 1) + "…";
//            }
//            paintContext.drawString(
//                    getLeftMargin(),
//                    (getHeight() - paintContext.getFontHeight()) / 2
//                            + paintContext.getAscent(), strBookTitle);
//            strBookTitle = null;
//            //LogUtil.d("ZLFileX", "header setFont .. after paint: curSize:" + paintContext.myFontSize);
//            LogUtil.d("ZLFileX", "header Finish Paint..");
//            //此处可处理vip购买信息
//
//        }
//
//        /**
//         * --------------------------------------------------------------------------------------------
//         * 绘制方法处理
//         */
//        /**
//         * 设置字体
//         *
//         * @param paintContext
//         */
//        private void setFont(ZLAndroidPaintContext paintContext) {
//            FBReaderApp reader = myReader;
//            if (reader == null) {
//                return;
//            }
//            final String family = reader.FooterFontOption.getValue();
//            if (myFontEntry == null || !family.equals(myFontEntry.get(0).Family)) {
//                myFontEntry = Collections.singletonList(FontEntry.systemEntry(family));
//            }
//            //设置字体样式
//            paintContext.setFont(myFontEntry,
//                    ReadRenderSetting.getInstance().getTitleFontSize(), false, false, false,
//                    false);
//        }
//
//        /**
//         * 设置文本颜色
//         *
//         * @param paintContext 绘制上下文
//         * @param zlColor      绘制颜色
//         */
//        private void setTextColor(ZLAndroidPaintContext paintContext, ZLColor zlColor) {
//            paintContext.setTextColor(zlColor);
//        }
//
//        /**
//         * 绘制当前时间
//         *
//         * @param text
//         * @param paintContext
//         * @param x
//         * @param y
//         */
//        private void drawCurrentTime(String text, ZLAndroidPaintContext paintContext, int x, int y) {
//            //绘制显示时间
//            if ((null == paintContext) || (x < 0) || (y < 0) || (null == text) || (text.isEmpty())) {
//                return;
//            }
//            paintContext.drawString(x, y, text);
//        }
//
//        /**
//         * 绘制电量图标
//         *
//         * @param bmp
//         * @param paintContext
//         * @param zlColor
//         * @param x
//         * @param y
//         */
//        private void drawBattery(Bitmap bmp, ZLAndroidPaintContext paintContext, ZLColor zlColor, int x, int y) {
//            if ((null == paintContext) || (x < 0) || (y < 0) || (null == bmp) || (bmp.isRecycled())) {
//                return;
//            }
//            FBReaderApp reader = myReader;
//            if (reader == null) {
//                return;
//            }
//            if (bmp != null) {
//                paintContext.setFillColor(!ReadStyle.isNight(ReadSettingUtil.getReadStyle()) ? zlColor : getTextColor(ZLTextHyperlink.NO_LINK));
//                int x1 = x + reader.getBatteryLevel()
//                        * (bmp.getWidth() - 6) / 100 - 1;
//                int y1 = y + bmp.getHeight() - 4;
//                if (reader.getBatteryLevel() > 0) {
//                    paintContext.fillRectangle(x + 3, y + 3, x1, y1);
//                    paintContext.drawBitmap(x, y, bmp);
//                }
//            }
//        }
//
//    }
//
//    public ZLFile myReadingFile;
//
//    public void setReadFile(ZLFile file) {
//        myReadingFile = file;
//    }
//
//    public String getBookTitle() {
//        String title = "";
//
//        if (myReadingFile != null && myReadingFile.getShelfBook() != null) {
//            title = "《" + myReadingFile.getShelfBook().getName() + "》";
//        }
//
//        return title;
//    }
//
//
//    private class Footer implements FooterArea {
//        private int titleHeight = -1;
//        private List<FontEntry> myFontEntry;
//
//        //        ZLAndroidPaintContext context = new ZLAndroidPaintContext(null, null, new ZLAndroidPaintContext.Geometry(0, 0, 0, 0, 0, 0), 0);
//        ZLAndroidPaintContext context = ZLAndroidPaintContext.getInstence("footer", null, null, new ZLAndroidPaintContext.Geometry(0, 0, 0, 0, 0, 0), 0);
//
//        @Override
//        public int getHeight() {
//            if (titleHeight < 0) {
//
//                final ReadRenderSetting renderSetting = ReadRenderSetting
//                        .getInstance();
//
//                final String family = myReader.FooterFontOption.getValue();
//                if (myFontEntry == null || !family.equals(myFontEntry.get(0).Family)) {
//                    myFontEntry = Collections.singletonList(FontEntry.systemEntry(family));
//                }
//                context.setFont(myFontEntry,
//                        renderSetting.getTitleFontSize(), false, false, false,
//                        false);
//
//                titleHeight = context.getFontHeight() + 2
//                        * renderSetting.getHeaderAndFooterVerticalPadding();
//
//            }
//            return titleHeight;
//        }
//
//
//        public void paint(ZLPaintContext context, PageIndex index) {
//            paint(myCurrModelData, context, index);
//        }
//
//
//        public TOCTree.Reference getReadingTOCTree() {
//            return myCurrModelData.getReadingTOCTree();
//        }
//
//        final PagePosition dumpPosition = new PagePosition(0, 100);
//
//        @Override
//        public void paint(ModelData data, ZLPaintContext context, PageIndex index) {
//
//            if (myReader == null || data == null) {
//                return;
//            }
//            final ReadRenderSetting renderSetting = ReadRenderSetting
//                    .getInstance();
//            final ZLAndroidPaintContext paintContext = (ZLAndroidPaintContext) context;
//
//
//            String strPositionDrawInfo;
//            int elementCount = data.getElementCount();
//            int readElementId = data.getReadElementId(index);
//            if (elementCount <= 0) {
//                elementCount = 1;
//                readElementId = 0;
//            }
//
//            if (readElementId >= elementCount) {
//                readElementId = elementCount - 1;
//            }
//            //绘制阅读进度
//            strPositionDrawInfo = String.format(Locale.CHINA, "%.2f%%",
//                    (readElementId * 100.0f / elementCount));
//            LogUtil.e("ReadProgtess_FBView", "show progress==>" + strPositionDrawInfo);
//            final String family = myReader.FooterFontOption.getValue();
//            if (myFontEntry == null || !family.equals(myFontEntry.get(0).Family)) {
//                myFontEntry = Collections.singletonList(FontEntry.systemEntry(family));
//            }
//            context.setFont(myFontEntry,
//                    renderSetting.getTitleFontSize(), false, false, false,
//                    false);
//
//            context.setTextColor(ReadSettingUtil.getCurHeaderFooterColor());
//
//            int posWidth = paintContext.getStringWidth(strPositionDrawInfo);
//            context.drawString(paintContext.getWidth() - getRightMargin()
//                    - posWidth, context.getHeight() - getHeight()
//                    + (getHeight() - paintContext.getFontHeight()) / 2
//                    + context.getAscent(), strPositionDrawInfo);
//            //绘制章节名称
//            int titleWidth = context.getWidth() - getLeftMargin() - getRightMargin() - posWidth * 2;
//            String strBookTitle = getBookTitle();
//            int charCount = paintContext.measureText(strBookTitle, titleWidth);
//            if (charCount > 0 && charCount < strBookTitle.length()) {
//                strBookTitle = strBookTitle.substring(0, charCount);
//            }
//            if (context.getWidth() != 0 && context.getHeight() != 0 && getHeight() != 0 && paintContext.getFontHeight() != 0 && !TextUtils.isEmpty(strBookTitle)) {
//                context.drawString(getLeftMargin(), context.getHeight()
//                        - getHeight()
//                        + (getHeight() - paintContext.getFontHeight()) / 2
//                        + context.getAscent(), strBookTitle);
//                strBookTitle = null;
//            }
//        }
//
//    }
//
//    public TOCTree.Reference getReadingTOCTree() {
//        return myCurrModelData.getReadingTOCTree();
//    }
//
//
//    @Override
//    public Footer getFooterArea() {
//        if (mFooter == null) {
//            mFooter = new Footer();
//        }
//        return mFooter;
//    }
//
//    @Override
//    public Header getHeaderArea() {
//        if (mHeader == null) {
//            mHeader = new Header();
////            try {
////                myReader.addTimerTask(mHeader.UpdateTask, 15000);
////            } catch (NullPointerException e) {
////                e.printStackTrace();
////                LogUtil.e("ReadProgtess_FBView", "间隔刷新头部myReader==null--" + (myReader == null));
////            }
//        }
//        return mHeader;
//    }
//
//
//    @Override
//    protected ExtensionElementManager getExtensionManager() {
//        return null;
//    }
//
//    private long mLastShowFirstPageToast = 0;
//
//    public void toastFirstPage() {
//        mMainHandler.post(new Runnable() {
//            @Override
//            public void run() {
//                long time = System.currentTimeMillis();
//                if (time - mLastShowFirstPageToast >= 400) {
//                    ToastUtil.showToast("已经是第一页了！");
//                    mLastShowFirstPageToast = time;
//                }
//            }
//        });
//    }
//
//
//    private long mLastDoProcessNoPageDataTime = 0;
//
//    /**
//     * native 加载章节 loadChapterWithNative
//     *
//     * @param context
//     * @param index
//     * @return
//     */
//    @Override
//    public boolean doProcessNoPageData(ZLPaintContext context, PageIndex index) {
//        // 加上冷却时间，避免快速翻页造成章节错乱
//        if (System.currentTimeMillis() - mLastDoProcessNoPageDataTime < 500) {
//            myReader.getViewWidget().abortAnimation();
//            return false;
//        }
//        LogUtil.i(GlobalConstants.READER_LOG, "FBView doProcessNoPageData  全新章节加载 = " + index.toString());
//        final FBReaderApp reader = (FBReaderApp) FBReaderApp.Instance();
//        final BookModel model = reader.Model;
//        boolean hasProcessEvt = true;
//        //区分当前书籍类型是否可以解析
//        if ((model.Book instanceof IChapterReadBook)) {//书籍类型底部可以解析txt类型
//            BasicChapterReader bookReader = ((IChapterReadBook) model.Book).getReader();
//            startPendingLoadPageData();
//            switch (index) {
//                case previous:
//                    if (bookReader.hasPreviousChapter()) {
//                        myPrevModelData.clear();
//                        paintModel(myPrevModelData, context, PageIndex.current, false);
//                        bookReader.gotoPreChapter(false);
//                    } else {
//                        stopPendingLoadPageData();
//                        myReader.getViewWidget().abortAnimation();
//                        paintModel(myCurrModelData, context, PageIndex.current, false);
//                        bookReader.doFirstChapter();
//                        hasProcessEvt = false;
//                    }
//                    break;
//                case next:
//                    if (bookReader.hasNextChapter()) {
//                        LogUtil.e("下章内容", "点击开始---切换章节");
//                        // LogUtil.e("zhongp","yes>>>>>>>>>>>>>>>>>>>>>>>>>>.");
//                        myNextModelData.clear();
//                        paintModel(myNextModelData, context, PageIndex.current, false);
//                        bookReader.gotoNextChapter();
//                    } else {
//                        if (ReadSettingUtil.getFlipAnimation() == ZLViewEnums.Animation.none) {
//                            myCurrModelData.setisEndPager(true);
//                        } else {
//                            myCurrModelData.setisEndPager(false);
//                        }
//                        stopPendingLoadPageData();
//                        myReader.getViewWidget().abortAnimation();
//                        if (ReadSettingUtil.isAutoFlip()) {
//                            ReadSettingUtil.setAutoFlip(false);
//                            ((ZLAndroidWidget) myReader.getViewWidget()).closeAutoRead();
//                            ToastUtil.showToast(GlobalApp.getInstance().getString(R.string.read_auto_flip_quited));
//                        } else {
//                            // LogUtil.e("zhongp","no>>>>>>>>>>>>>>>>>>>>>>>>>>.");
////                            bookReader.doLastChapter();
//                        }
//                        StaticsLogService.sendLog("3620", "", myReadingFile.getShelfBook().getBookId());
//                        myReader.getAppContext().startActivity(ReadEndActivity.Instance(myReader.getAppContext(), getBookTitle(), myReadingFile.getShelfBook().getBookId()));
//                        hasProcessEvt = false;
//                    }
//
//                    break;
//                default:
//                    break;
//            }
//        } else {
//            switch (index) {
//                case previous: {
//                    toastFirstPage();
//                    paintModel(myCurrModelData, context, PageIndex.current, false);
//                    myReader.getViewWidget().abortAnimation();
//                    hasProcessEvt = false;
//                    break;
//                }
//                case current:
//                    break;
//                case next: {
//                    paintModel(myCurrModelData, context, PageIndex.current, false);
//                    myReader.getViewWidget().abortAnimation();
////                    myReader.getAppContext().onBackPressed();
//                    if (ReadSettingUtil.isAutoFlip()) {
//                        ReadSettingUtil.setAutoFlip(false);//停止自动翻页功能
//                        ((ZLAndroidWidget) myReader.getViewWidget()).closeAutoRead();//关闭自动朗读功能
//                        ToastUtil.showToast(GlobalApp.getInstance().getString(R.string.read_auto_flip_quited));
//                    } else {
//                        hasProcessEvt = false;
////                            ActivityHelper.doJumpToWeb(myReader.getAppContext(), UrlManager.getRecommendBooksUrl(""));
//                    }
//                    StaticsLogService.sendLog("3620", "", myReadingFile.getShelfBook().getBookId());
//                    myReader.getAppContext().startActivity(ReadEndActivity.Instance(myReader.getAppContext(), getBookTitle(), myReadingFile.getShelfBook().getBookId()));
//                    break;
//                }
//                default:
//                    break;
//            }
//        }
//        mLastDoProcessNoPageDataTime = System.currentTimeMillis();
//        return hasProcessEvt;
//    }
//
//    public synchronized void initChapterTips(String bookId, Chapter chapter, boolean needPay, int payType, double balance, long price, byte[] desc) {
//        LogUtil.d("ZLFile", "bookId:" + bookId);
//        mChapterTips = new ChapterTipsInfo(bookId, chapter, needPay, payType, balance, price, desc);
//        getZoneMap().clear();
//        if (needPay) {
//            getZoneMap().addRectangleTapZone(mChapterTips.mByBookZone, ActionCode.READ_BY_ACTION);
//            getZoneMap().addRectangleTapZone(mChapterTips.mPreZone, ActionCode.READ_PRE_ACTION);
//            getZoneMap().addRectangleTapZone(mChapterTips.mBuyVipZone, ActionCode.READ_OPEN_VIP_ACTION);
//        } else {
//            getZoneMap().addRectangleTapZone(mChapterTips.mRefreshZone, ActionCode.READ_REFRESH_ACTION);
//        }
//    }
//
//    @Override
//    public boolean needPainTips(Chapter chapter) {
//        if (mChapterTips == null || chapter == null) {
//            return false;
//        }
//        if (mChapterTips.mReadingChapter == null || mChapterTips.mReadingChapter.getId() == null || TextUtils.isEmpty(chapter.getId())) {
//            return false;
//        }
//        return chapter.getId().equals(mChapterTips.mReadingChapter.getId());
//    }
//
//    @Override
//    protected void paintTips(ZLPaintContext context) {
//        if (mChapterTips != null) {
//            // 使用语音朗读的情况下
//            if (TTSManager.getInstance().isWorking() && TTSManager.getInstance().getStatus() != TTSManager.STATUS_STOP) {
//                ToastUtil.showToast(GlobalApp.getInstance().getString(R.string.read_speak_quited));
//                TTSManager.getInstance().stop();
//                TTSManager.getInstance().onlyOneSpeak("该章节为付费章节，请购买后阅读");
//            }
//            if (ReadSettingUtil.isAutoFlip()) {
//                ReadSettingUtil.setAutoFlip(false);
//                if (FBReaderApp.Instance() != null && FBReaderApp.Instance().getAppContext() != null
//                        && FBReaderApp.Instance().getAppContext().getZLWidget() != null)
//                    FBReaderApp.Instance().getAppContext().getZLWidget().closeAutoRead();
//            }
//
//            if (getAnimationType() == Animation.vertical) {
//                context.clear(new ZLColor(255, 255, 255, 0));
//            } else {
//                final ZLFile wallpaper = getWallpaperFile();
//                if (wallpaper != null) {
//                    context.clear(wallpaper, getFillMode());
//                } else {
//                    context.clear(getBackgroundColor());
//                }
//            }
//            getHeaderArea().paint(myCurrModelData, context, PageIndex.current);
//            getFooterArea().paint(myCurrModelData, context, PageIndex.current);
//            if (mChapterTips != null) {
//                mChapterTips.paint(context);
//            }
//
//            if (myReader.getBookReader() instanceof MTxtNovelReader) {
//                // 书城图书通知翻到上一章
//                Message msg = Message.obtain();
//                msg.what = MessageCenter.MSG_READ_CHANGING_CHAPTER;
//                msg.arg1 = 0;
//                MessageCenter.broadcast(msg);
//            }
//
//        }
//    }
//
//    @Override
//    public void destroyTips(Chapter chapter) {
//        if (needPainTips(chapter)) {
//            getZoneMap().removeRectangleTapZoneByName(mChapterTips.mLeftZone);
//            getZoneMap().removeRectangleTapZoneByName(mChapterTips.mRightZone);
//            mChapterTips.chapterDescDrawStrings.clear();
//            mChapterTips = null;
//        }
//    }
//
//    @Override
//    public void destroyTips() {
//        if (mChapterTips != null) {
////            getZoneMap().removeRectangleTapZoneByName(mChapterTips.mLeftZone);
////            getZoneMap().removeRectangleTapZoneByName(mChapterTips.mRightZone);
//            getZoneMap().removeRectangleTapZoneByName(mChapterTips.mByBookZone);
//            getZoneMap().removeRectangleTapZoneByName(mChapterTips.mPreZone);
//            getZoneMap().removeRectangleTapZoneByName(mChapterTips.mBuyVipZone);
//            getZoneMap().removeRectangleTapZoneByName(mChapterTips.mRefreshZone);
//
//
//            mChapterTips.chapterDescDrawStrings.clear();
//            mChapterTips = null;
//        }
//    }
//
//    public void resetTips() {
//        if (mChapterTips != null) {
//            mChapterTips.resetPosition();
//        }
//    }
//
//    public synchronized void destroyLoadFailedTipInfo() {
////        if (mChapterTips != null) {
////            getZoneMap().removeRectangleTapZoneByName(mChapterTips.mLeftZone);
////            getZoneMap().removeRectangleTapZoneByName(mChapterTips.mRightZone);
////            mChapterTips.chapterDescDrawStrings.clearCache();
////        }
////        mChapterTips = null;
//    }
//
//    public class ChapterTipsInfo {
//        private List<String> chapterDescDrawStrings = new ArrayList<String>();
//        private int drawTopY = 0;
//        private String mTitle;
//        private String mLeftTxt, mRightTxt;
//        private boolean mNeedPay;
//        private RectangleZone mLeftZone, mRightZone;
//        private String mReadingBookId;
//        private Chapter mReadingChapter;
//        private List<FontEntry> myFontEntry;
//        private Bitmap mTipBitmap;
//        private int ascent = 0;
//        private String mPrice;
//        private String mByBook;
//        private String mPre;//优惠推荐
//        private String openVip;
//        private String setting;
//        private String refresh;
//        private RectangleZone mPriceZone, mByBookZone//购买本章
//                , mPreZone//优惠
//                , mBuyVipZone//开通Vip
//                , mRefreshZone//刷新
//                , mSettingZone//设置
//
//                ;
//        private int payType;
//        private double balance;
//        private long price;
//        private byte[] desc;
//
//        @SuppressLint("StringFormatMatches")
//        public ChapterTipsInfo(String bookId, Chapter chapter, boolean needPay, int payType, double balance, long price, byte[] desc) {
//            if (!TextUtils.isEmpty(bookId)) {
//                mReadingBookId = bookId;
//            }
//            if (chapter != null) {
//                mReadingChapter = chapter;
//            }
//            this.payType = payType;
//            this.balance = balance;
//            mNeedPay = needPay;
//            this.price = price;
//            this.desc = desc;
//            if (needPay) {
////                mTitle = GlobalApp.getInstance().getString(R.string.txt_buy_tip);
//                mLeftTxt = GlobalApp.getInstance().getString(R.string.txt_refresh);
//                try {
//                    mTitle = new String(desc, "UTF-8");
//                } catch (Exception e) {
//                    e.printStackTrace();
//                }
//                mByBook = "购买本章";
//                mPre = "批量购买，享受更多优惠";
//                openVip = "开通VIP，立享全站免费";
//                mTipBitmap = ReadRenderSetting.getInstance().getChapterPayBitmap();
//            } else {
//                mTitle = GlobalApp.getInstance().getString(R.string.txt_no_network);
//                setting = GlobalApp.getInstance().getString(R.string.setting);
//                refresh = GlobalApp.getInstance().getString(R.string.txt_refresh);
//                mTipBitmap = ReadRenderSetting.getInstance().getNoNetBitmap();
//            }
//            resetPosition();
//        }
//
//        public void resetPosition() {
//            mByBookZone = new RectangleZone(1, 1, 1, 1);//临时初始值
//            mPreZone = new RectangleZone(2, 2, 2, 2);//临时初始值
//            mBuyVipZone = new RectangleZone(3, 3, 3, 3);//临时初始值
//            mRefreshZone = new RectangleZone(4, 4, 4, 4);//临时初始值
//            mSettingZone = new RectangleZone(5, 5, 5, 5);//临时初始值
//            drawTopY = getTopMargin() + 15;
//        }
//
//        public void paint(ZLPaintContext context) {
//            ZLAndroidPaintContext myDrawContext = (ZLAndroidPaintContext) context;
//            int topY = drawTopY;
////            //绘制头部章节
//            Chapter currChapter = getCurrChapter();
//            if (currChapter == null) {
//                return;
//            }
//            String CurrTopName = currChapter.getName();
//
//            mByBookZone.setExtralData(new Object[]{payType, price, mReadingChapter.getId(), mReadingChapter});
//            mBuyVipZone.setExtralData(new Object[]{mReadingChapter});
//            mPreZone.setExtralData(new Object[]{mReadingChapter});
//            mRefreshZone.setExtralData(new Object[]{"", mReadingChapter});
//            HashMap<DrawBuy, TapZoneMap.RectangleZone> drawBuyRectangleZoneHashMap = new HashMap<>();
//            if (mNeedPay) {
//                drawBuyRectangleZoneHashMap.put(DrawBuy.DRAW_BUY, mByBookZone);
//                drawBuyRectangleZoneHashMap.put(DrawBuy.DRAW_BATCH_BUY, mPreZone);
//                drawBuyRectangleZoneHashMap.put(DrawBuy.DRAW_OPEN_VIP, mBuyVipZone);
//            } else {
//                drawBuyRectangleZoneHashMap.put(DrawBuy.NO_NET_WORK_REFRESH, mRefreshZone);
//            }
//
//            DrawBuyView.with().
//                    setFBView(FBView.this)
//                    .setFontEntrys(myFontEntry)
//                    .setTopY(topY)
//                    .setNeedPay(mNeedPay)
//                    .setZLAndroidPaintContext(myDrawContext)
//                    .setRectangleZone(drawBuyRectangleZoneHashMap)
//                    .builder()
//                    .setmByBookType(payType)
//                    .setPayType(payType)
//                    .setCurrTopName(CurrTopName)
//                    .setmPrice(price + "", Integer.parseInt(new java.text.DecimalFormat("0").format(balance)) + "")
//                    .setmTitle(mTitle)
//                    .draw();
//        }
//
//        public Chapter getChapter() {
//            return mReadingChapter;
//        }
//
//    }
//
//    private ChapterTipsInfo mChapterTips;
//
//    public ChapterTipsInfo getChapterTips() {
//        return mChapterTips;
//    }
//
//    private ZLPaintContext getPaintContext(PageIndex index) {
//        return myReader.getViewWidget().getPaintContext(index);
//    }
//
//    /**
//     * 缓存上一章
//     *
//     * @param chapter
//     * @param model
//     * @param toFirstPage
//     */
//    public void setPrevModel(Chapter chapter, ZLTextModel model, final boolean toFirstPage) {
//        if (model == null || !model.isLoaded()) {
//            stopPendingLoadPageData();
//            myReader.getViewWidget().repaint();
//        } else {
//            synchronized (this) {
//                myPrevModelData.setModel(chapter, model);
//                if (toFirstPage) {//不是最后，也不是第一页
//                    myPrevModelData.gotoFirstPage();
//                } else {
//                    myPrevModelData.gotoLastPage();//到最后一页
//                }
//            }
//            destroyTips(chapter);
//            destroyLoadFailedTipInfo();
//            ZLApplication reader = FBReaderApp.Instance();
//            final ZLAndroidWidget widget = (ZLAndroidWidget) reader.getViewWidget();
//            if (widget.isAnimating()) {
//                widget.setTurnPageHookCallBack(new Runnable() {
//                    @Override
//                    public void run() {
//                        repaintLoadChapter(PageIndex.previous, toFirstPage);
//                    }
//                });
//                myReader.getBookReader().getAnimationManager().clearCacheAndRePaint();
//            } else {
//                repaintLoadChapter(PageIndex.previous, toFirstPage);
//            }
//        }
//        addAdViewMsg(chapter, -1);
//    }
//
//    /**
//     * 缓存下一章
//     *
//     * @param chapter
//     * @param model
//     */
//    public void setNextModel(Chapter chapter, ZLTextModel model) {
//        if (model == null || !model.isLoaded()) {
//            stopPendingLoadPageData();//应该是加载下一章节
//            myReader.getViewWidget().repaint();
//        } else {
//            destroyTips(chapter);
//            destroyLoadFailedTipInfo();
//
//            synchronized (this) {
//                myNextModelData.setModel(chapter, model);
//                myNextModelData.gotoFirstPage();
//            }
//
//            FBReaderApp reader = (FBReaderApp) FBReaderApp.Instance();
//            final ZLAndroidWidget widget = (ZLAndroidWidget) reader.getViewWidget();
//            if (widget.isAnimating()) {//滑动中
//                widget.setTurnPageHookCallBack(new Runnable() {
//                    @Override
//                    public void run() {
//                        repaintLoadChapter(PageIndex.next, true);
//                    }
//                });
//                myReader.getBookReader().getAnimationManager().clearCacheAndRePaint();
//            } else {
//                repaintLoadChapter(PageIndex.next, true);
//            }
//        }
//        //加入插屏广告
//        addAdViewMsg(chapter, 1);
//    }
//
//    /**
//     * 加入插屏广告信息
//     *
//     * @param chapter
//     */
//    private void addAdViewMsg(Chapter chapter, int nextChapter) {
//        if (myReader.getBookReader() instanceof MTxtNovelReader) {
//            Message msg = Message.obtain();
//            msg.what = MessageCenter.MSG_READ_CHANGING_CHAPTER;
//            msg.arg1 = nextChapter;
//            msg.obj = Pair.create(getCurrChapter(), chapter);
//            MessageCenter.broadcast(msg);
//        }
//    }
//
//    /**
//     * 重新绘制并加载下一章节，有个问题就是在这里为什么不直接记载章节，而是要重绘制之后再加载
//     */
//    private void repaintLoadChapter(PageIndex pageIndex, boolean isFirst) {
//        stopPendingLoadPageData();//停止加载，进行
//        shiftChapter(pageIndex, isFirst);
//        myReader.getBookReader().getAnimationManager().doForceRepaintly();
//    }
//
//    @Nullable
//    private Chapter getCurrChapter() {
//        Chapter currChapter = null;
//        if (myReader.getBookReader() instanceof MTxtNovelReader) {
//            currChapter = ((MTxtNovelReader) myReader.getBookReader()).getReadingChapter();
//        } else if (myReader.getBookReader() instanceof MTxtReader) {
//            currChapter = ((MTxtReader) myReader.getBookReader()).getReadingChapter();
//        }
//        return currChapter;
//    }
//
//
//    public List<Bookmark> getBookmarksInPage() {
//        List<Bookmark> bookmarks = new ArrayList<Bookmark>();
//        ZLTextPosition startCursor = getStartCursor();
//        ZLTextPosition endCursor = getEndCursor();
//        if (FBReaderApp.Instance() == null
//                || ((FBReaderApp) FBReaderApp.Instance()).Model == null) {
//            return new ArrayList<Bookmark>();
//        }
//        List<Bookmark> allmarks = ((FBReaderApp) FBReaderApp.Instance()).Model
//                .getAllBookmarks();
//        int compare1 = 0, compare2 = 0;
//
//        String tag = null;
//
//        final FBReaderApp reader = myReader;
//
//        final BookModel model = reader.Model;
//        if (model != null && model.Book != null
//                && model.Book instanceof IChapterReadBook) {
//            final BasicChapterReader txtReader = ((IChapterReadBook) (model.Book))
//                    .getReader();
//            if (txtReader != null) {
//                tag = txtReader.getReadingChapter() != null ? txtReader
//                        .getReadingChapter().getId() : null;
//            }
//
//        }
//        if (tag == null) {
//            for (Bookmark mark : allmarks) {
//                compare1 = mark.compareTo(startCursor);
//                compare2 = mark.compareTo(endCursor);
//                if (compare1 >= 0 && compare2 < 0) {
//                    bookmarks.add(mark);
//                }
//            }
//        } else {
//
//            for (Bookmark mark : allmarks) {
//                if (!tag.equalsIgnoreCase(mark.getTag())) {
//                    continue;
//                }
//                compare1 = mark.compareTo(startCursor);
//                compare2 = mark.compareTo(endCursor);
//                if (compare1 >= 0 && compare2 < 0) {
//                    bookmarks.add(mark);
//                }
//            }
//        }
//        return bookmarks;
//    }
//
//    /**
//     * @return the forceHideBookMark
//     */
//    @SuppressWarnings("unused")
//    public boolean isForceHideBookMark() {
//        return mForceHideBookMark;
//    }
//
//    /**
//     * @param forceHideBookMark the forceHideBookMark to set
//     */
//    public void setForceHideBookMark(boolean forceHideBookMark) {
//        mForceHideBookMark = forceHideBookMark;
//    }
//
//    public void onResume() {
//        stopPendingLoadPageData();
//    }
//
//    public void initErrorInfo(String errTipMsg) {
//        stopPendingLoadPageData();
//        LogUtil.e("ERROR", "FBView initErrorInfo.. : " + errTipMsg);
//    }
//
//    public void destroy() {
//        myReader = null;
//        mHeader = null;
//        mFooter = null;
//        if (null != mMainHandler) {
//            mMainHandler.removeCallbacksAndMessages(null);
//        }
//        mMainHandler = null;
//        myCurrModelData = null;
//        myPrevModelData = null;
//        myNextModelData = null;
//        if (null != mChapterHandler) {
//            mChapterHandler.removeCallbacksAndMessages(null);
//        }
//
//    }
//
//    public int getReadContentId() {
//        return myCurrModelData == null ? 0 : myCurrModelData.getReadElementId(PageIndex.current);
//    }
//
//    public int getReadContentLength() {
//        return myCurrModelData == null ? 1 : myCurrModelData.getElementCount();
//    }
//
//    //***************************5.7.0加入章节存入本地***************************
//    private Handler mChapterHandler;
//
//    class RecordChapterHander extends HandlerThread {
//
//        public RecordChapterHander(String name) {
//            super(name);
//        }
//    }
//
//    private boolean isFirstRead = false;
//
//    private void startChapterThread() {
//        RecordChapterHander chapterHander = new RecordChapterHander("chapterHander");
//        chapterHander.start();
//        mChapterHandler = new Handler(chapterHander.getLooper()) {
//
//            @Override
//            public void handleMessage(Message msg) {
//                if (!isFirstRead) {
//                    isFirstRead = true;
//                    saveCurrChapterPosition();
//                }
//            }
//        };
//
//    }
//
//    /**
//     * 保存当前章节和时间
//     */
//    private void saveCurrChapterPosition() {
//        CommonSettings.getInstance().saveStr(TaskWelfUtils.ADD_READER_TIMER_TASK, String.valueOf(System.currentTimeMillis()));
//    }
//
//    public interface OnPageChangedListener {
//
//        void onPageChange();
//
//    }

}
